package main
{
	import mx.controls.Alert;
	import mx.core.Application;
	import mx.messaging.messages.*;
	
	/**
	 * Klasse zum verwalten der Spielaktionen
	 * @author 3KP
	 * 
	 */
	public class PokerControl
	{
		public static var rT:RemoteTable;
		private static var app : Object = Application.application;
		private static var appF : Object = Application.application.facade;
		private static var appE : Object = Application.application.pokerEngine;
		/**
		 * Webcams anstossen 
		 * Sitzposition bestimmen
		 */		
		public static function pokerStart():void{
			
			WebcamControl.webcamInitiate();
			GameControl.calcSeatPos(); 
		}
		
		/**
		 *  Verwaltet Aktionen beim druecken auf Check Call Button
		 * 
		 */		
		public static function actionCheckCall():void{
			if(rT.highestBet-rT.playersBets[rT.activePlayerIndex] == 0) { 
				// Spieler checkt regulaer
				appF.doAction("COMMAND_CHECK",0);
			} else if(parseInt(appE.betInput.text) >= rT.highestBet-rT.playersBets[rT.activePlayerIndex] && rT.playersStacks[rT.activePlayerIndex] >= rT.highestBet-rT.playersBets[rT.activePlayerIndex]) { 
				// Spieler called regulaer
				appF.doAction("COMMAND_CALL",rT.highestBet-rT.playersBets[rT.activePlayerIndex]);
			} else if(parseInt(appE.betInput.text) < rT.highestBet-rT.playersBets[rT.activePlayerIndex] && rT.playersStacks[rT.activePlayerIndex] >= rT.highestBet-rT.playersBets[rT.activePlayerIndex]) { 
				// Spieler call zu niedrig -> setzt highest Bet
				appF.doAction("COMMAND_CALL",rT.highestBet-rT.playersBets[rT.activePlayerIndex]); 
			} else { 
				// Spieler call zu niedrig und nicht genug chips --> ist ALL IN
				appF.doAction("COMMAND_CALL",rT.playersStacks[rT.activePlayerIndex]); 
			}
			disableButtons();
		}
		
		/**
		 *  Verwaltet Aktionen beim druecken auf Bet Raise Button
		 * 
		 */		
		public static function actionBetRaise():void{
			
			if(rT.highestBet == 0 && parseInt(appE.betInput.text) >= rT.bigBlind && rT.playersStacks[rT.activePlayerIndex] >= rT.bigBlind){	
				// Spieler macht regulaeren Bet
				appF.doAction("COMMAND_BET",parseInt(appE.betInput.text));
			} else if(rT.highestBet == 0 && parseInt(appE.betInput.text) == rT.playersStacks[rT.activePlayerIndex]) { 
				// Spieler geht dabei ALL IN
				appF.doAction("COMMAND_BET",parseInt(appE.betInput.text));
			} else if(rT.highestBet == 0 && parseInt(appE.betInput.text) < rT.bigBlind && rT.playersStacks[rT.activePlayerIndex] >= rT.bigBlind){ 
				// Spieler Bet zu niedrig -> setzt BB
				appF.doAction("COMMAND_BET",rT.bigBlind);
			} else if(rT.highestBet == 0){ 
				//Spieler Bet zu niedrig und nicht genug chips -> ist ALL IN 
				appF.doAction("COMMAND_BET",rT.playersStacks[rT.activePlayerIndex]);
			} else if(parseInt(appE.betInput.text)+rT.playersBets[rT.activePlayerIndex] >= rT.highestBet*2-rT.secondHighestBet && rT.playersStacks[rT.activePlayerIndex]+rT.playersBets[rT.activePlayerIndex] >= rT.highestBet*2-rT.secondHighestBet){ 
				// Spieler macht regulaeres Raise
				appF.doAction("COMMAND_RAISE",parseInt(appE.betInput.text));
			} else if(parseInt(appE.betInput.text) == rT.playersStacks[rT.activePlayerIndex] && rT.playersStacks[rT.activePlayerIndex]+rT.playersBets[rT.activePlayerIndex] > rT.highestBet){ 
				// Spieler geht ALL IN, kein voller raise
				appF.doAction("COMMAND_RAISE",parseInt(appE.betInput.text));
			} else if(rT.playersStacks[rT.activePlayerIndex] >= rT.highestBet*2-rT.secondHighestBet-rT.playersBets[rT.activePlayerIndex]) {
				// Spieler Raise zu niedrig -> setzt doppelten highest Bet
				appF.doAction("COMMAND_RAISE",rT.highestBet*2-rT.secondHighestBet-rT.playersBets[rT.activePlayerIndex]);
			} else if(rT.highestBet < (rT.playersStacks[rT.activePlayerIndex]+ rT.playersBets[rT.activePlayerIndex]) && (rT.playersStacks[rT.activePlayerIndex]+ rT.playersBets[rT.activePlayerIndex]) < rT.highestBet*2-rT.secondHighestBet){ // Spieler Raise zu niedrig und nicht genug chips -> ist ALL IN
				appF.doAction("COMMAND_RAISE",rT.playersStacks[rT.activePlayerIndex]);
			} else { 
				// Spieler Raise zu niedrig und nicht genug chips -> ist ALL IN !! CALL !!
				appF.doAction("COMMAND_CALL",rT.playersStacks[rT.activePlayerIndex]);
			}
			disableButtons();
		}
		
		/**
		 *  Verwaltet Aktionen beim druecken auf Fold Button
		 * 
		 */		
		public static function actionFold():void{
			appF.doAction("COMMAND_FOLD",0);
			disableButtons();			
		}
		
		/**
		 *  disabled Buttons nach Aktion
		 * 
		 */		
		private static function disableButtons():void{
			appE.gameButtons.enabled=false;
		}
		
		/**
		 *  Setzt den Text von betInput auf den Wert des Spielerstack, 
		 *  wenn er mehr eingibt als sein Stack beträgt
		 */		
		public static function checkValue() :void{
			if(parseInt(appE.betInput.text) > rT.playersStacks[rT.activePlayerIndex]){
				appE.betInput.text=rT.playersStacks[rT.activePlayerIndex];
			}
		}
		
		/**
		 * Oeffnet Optionen Panel 
		 * 
		 */		
		public static function openOptions() :void{
			appE.option.visible=true;
			
		}
		
		/**
		 * Schliesst Optionen Panel 
		 * 
		 */	
		public static function closeOptions() :void{
			appE.option.visible=false;
		}
		
		/**
		 * beendet das Replay 
		 * 
		 */		
		public static function endReplays():void{
			var message:AsyncMessage = new AsyncMessage();
			message.body = new Object();
			message.body.gameState = "1";
			app.producerGameState.send(message);
		}
		
	}
}